#ifndef SYMBOLE_H_
#define SYMBOLE_H_

#include <iostream>
#include <vector>
#include <string>
using namespace std;

/*! \file Symbole.h
    \brief spécification de la classe Symbole
    \author Koelsch + Jamet
    \date 19/12/2012
 */       




#define FICHIER_MOTS_CLE "motsCles.txt"

/*! \class Symbole
    \brief La classe représentant les Symboles
   
    Cette classe permet de représenter les Symboles lus dans le programme
    Elle contient les méthodes suivantes :
    \li ~Symbole
    \li Symbole
    \li getChaine
 
    Elle definit les opérateurs ==, != et << 
    Elle contient également 2 attributs et un type enuméré
 */
class Symbole {
public:
/*! \brief La définition du type énuméré categorieSymbole
*/
	enum categorieSymbole { MOTCLE, VARIABLE, ENTIER, INDEFINI, FINDEFICHIER, STRING, REEL };
        
/*! \fn ~Symbole() 
    \brief destructeur de Symbole
*/      virtual ~Symbole() {}
          
/*! \fn Symbole(string s=string(""))
    \brief Constructeur de Symbole

    Créé un symbole avec s pour chaine, s est par défaut attribué a null.
    \param s : la chaine du symbole créé.         
 */     Symbole(string s=string(""));
          
          
/*! \fn string getChaine()
    \brief Getter de la valeur de la chaine de symbole
    \return string - La valeur de l'attribut chaine du symbole.    
 */     inline string getChaine()           { return this->chaine;} 
        
        
/*! \brief Definition des operations ==, !=, <<
    
    Dans l'ordre, operateur de comparaison entre deux symboles, il compare les chaines pour verifier leur similarité (vrai si s1 vaut s2)
    Operateur de difference, verifie qu'il existe une difference entre 2 chaines de symbole (vrai si s1 ne vaut pas s2)
    Affiche via cout le contenu de la chaine du symbole
 */     bool operator == (string ch) ; 
	inline bool operator != (string ch) { return ! (*this == ch); } 
	friend ostream & operator <<(ostream & cout, Symbole symb);     // fonction amie pour pouvoir afficher un symbole sur cout 

private:
    
/*! \var string chaine
    \brief La chaine servant a l'identification du symbole
*/      string           chaine;             
        
        
/*! \var categorieSymbole categorie
    \brief Pour connaitre le type du symbole
*/      categorieSymbole categorie;           
          
          
/*! \fn isMotCle(string s)
    \brief Verification du statut de mot-clé du symbole

    On compare la chaine du symbole à la liste de mots clés afin 
    de savoir si oui ou non le symbole est un mot clé :
    renvoie vrai si s est un mot clé du langage.
    \param s : la chaine du symbole à comparer.         
 */     static bool      isMotCle(string s);  // méthode de classe : renvoie vrai si s est un mot clé du langage
};

#endif /* SYMBOLE_H_ */
